home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / visulztn / saoimage / saoimage.lha / irafdisp.c < prev    next >
C/C++ Source or Header  |  1990-05-01  |  8KB  |  244 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    irafdisp.c (Iraf Display)
  6.  * Purpose:    Respond to input from IRAF meant for Imtool
  7.  * Subroutine:    imtool_reinit()            returns: int
  8.  * Subroutine:    disp_subpiece()            returns: void
  9.  * Subroutine:    set_imtool_scale()        returns: void
  10.  * Subroutine:    set_imtool_color()        returns: void
  11.  * Copyright:    1989 Smithsonian Astrophysical Observatory
  12.  *        You may do anything you like with this file except remove
  13.  *        this copyright.  The Smithsonian Astrophysical Observatory
  14.  *        makes no representations about the suitability of this
  15.  *        software for any purpose.  It is provided "as is" without
  16.  *        express or implied warranty.
  17.  * Modified:    {0} Michael VanHilst                7 Nov 1989
  18.  *        {1} MVH don't set imtool_colors if halftone    24 Nov 1989
  19.  *        {n} <who> -- <does what> -- <when>
  20.  */
  21.  
  22. #ifdef IMTOOL
  23.  
  24. #include <stdio.h>        /* stderr, FILE, NULL, etc. */
  25. #include <X11/Xlib.h>        /* get X types and constants */
  26. #include <X11/Xutil.h>        /* X window manager stuff */
  27. #include "hfiles/constant.h"    /* define codes */
  28. #include "hfiles/struct.h"    /* declare structure types */
  29. #include "hfiles/extern.h"    /* extern main SAOimage parameter structures */
  30. #include "hfiles/scale.h"    /* define scaling constants */
  31.  
  32. /*
  33.  * Subroutine:    imtool_reinit
  34.  * Purpose:    Reinitialize parameters after any buffer size change and
  35.  *        before loading new
  36.  */
  37. void imtool_reinit ( width, height )
  38.      int width, height;
  39. {
  40.   void init_img(), init_dispcen(), d_transform(), new_panbox();
  41.   int init_imagebuf();
  42.  
  43.   img.fiX1 = 1;
  44.   img.fiY1 = 1;
  45.   img.fiX2 = width;
  46.   img.fiY2 = height;
  47.   /* force default of display center on new size, else use current center */
  48.   if( (img.filecols != width) || (img.filerows != height) ) {
  49.     img.filecols = width;
  50.     img.filerows = height;
  51.     img.fdcenX = 0.0;
  52.     img.fdcenY = 0.0;
  53.     img.fdblock = 0;
  54.   } else {
  55.     float fdx, fdy;
  56.     /* translate from file to img coords */
  57.     d_transform(&coord.imgtofile, coord.id.cenX, coord.id.cenY, &fdx, &fdy);
  58.     img.fdcenX = (double)fdx;
  59.     img.fdcenY = (double)fdy;
  60.     img.fdblock = coord.id.block;
  61.   }
  62.   /* initialize imaging parameters */
  63.   if( control.IRAF_out.protocol == IOP_PROS )
  64.     img.file_type = SOP_PROS;
  65.   else
  66.     img.file_type = SOP_Imtool;
  67.   /* imtool packets are 8bit (for now, anyway) */
  68.   img.bytepix = 1;
  69.   init_img(&img, &coord);
  70.   init_dispcen(&img, &coord);
  71.   (void)init_imagebuf();
  72.   /* don't flag that buffer must be loaded, it's not that kind of load */
  73.   coord.buferror = 0;
  74.   buffer.load_filebuf = 0;
  75.   /* set up the panbox accordingly */
  76.   new_panbox(1);
  77. }
  78.  
  79. /*
  80.  * Subroutine:    disp_subpiece
  81.  * Purpose:    Map and display a sub-section of the full buffer.
  82.  */
  83. void disp_subpiece ( x1, y1, x2, y2 )
  84.      int x1, y1, x2, y2;    /* i: coordinates in buffer.shortbuf */
  85. {
  86.   float dx1, dy1, dx2, dy2;
  87.   float iX1, iY1, iX2, iY2;
  88.   Coordsys disp;
  89.   Edges bd;
  90.   int dy, dh;
  91.   int bh, block, py_off;
  92.   char *data;
  93.   short *sb, *pb;
  94.   void d_transform(), set_edges(), map_dispbox(), disp_dispbox();
  95.   void set_dispoff(), new_panimage();
  96.  
  97.   /* set box to map only the given section */
  98.   bcopy((char *)&coord.disp, (char *)&disp, sizeof(Coordsys));
  99.   bcopy((char *)&coord.bd, (char *)&bd, sizeof(Edges));
  100.   d_transform(&coord.buftoimg, (double)x1, (double)y1, &iX1, &iY1);
  101.   d_transform(&coord.imgtodisp, (double)iX1, (double)iY1, &dx1, &dy1);
  102.   d_transform(&coord.buftoimg,
  103.           (double)(x2 + 1), (double)(y2 + 1), &iX2, &iY2);
  104.   d_transform(&coord.imgtodisp, (double)iX2, (double)iY2, &dx2, &dy2);
  105.   /* ignore if section is not visible in the display window */
  106.   if( (dx1 <= (float)dispbox.width) && (dx2 > 1.0) &&
  107.       (dy1 <= (float)dispbox.height) && (dy2 > 1.0) ) {
  108.     /* clip edges to the display window */
  109.     if( dx1 < 0.0 )
  110.       dx1 = 0.0;
  111.     if( dx2 > (float)dispbox.width )
  112.       dx2 = (float)dispbox.width;
  113.     if( dy1 < 0.0 )
  114.       dy1 = 0.0;
  115.     if( dy2 > (float)dispbox.height )
  116.       dy2 = (float)dispbox.height;
  117.     coord.disp.X1 = dx1;
  118.     coord.disp.Y1 = dy1;
  119.     coord.disp.X2 = dx2;
  120.     coord.disp.Y2 = dy2;
  121.     coord.disp.Y1i = (int)dy1;
  122.     coord.disp.Y2i = (int)dy2 - 1;
  123.     coord.disp.Yhght = 1 + coord.disp.Y2i - coord.disp.Y1i;
  124.     set_edges(&coord.disptobuf, &coord.buf, &coord.disp, &coord.bd);
  125.     /* redefine the edges in the display window if at edge of buffer */
  126.     if( coord.bd.block < 0 )
  127.       set_dispoff(&coord.disptobuf, &coord.disp, &coord.bd);
  128.     map_dispbox();
  129.     bcopy((char *)&disp, (char *)&coord.disp, sizeof(Coordsys));
  130.     bcopy((char *)&bd, (char *)&coord.bd, sizeof(Edges));
  131.     /* set box to only draw the given section */
  132.     dy = dispbox.yzero;
  133.     dh = dispbox.yheight;
  134.     data = dispbox.image.data;
  135.     dispbox.yzero = dy1;
  136.     dispbox.yheight = (int)(0.5 + dy2 - dy1);
  137.     /* note this works for halftone (bit/pixel) and color (byte/pixel) */
  138.     dispbox.image.data += (dispbox.yzero * dispbox.image.bytes_per_line);
  139.     disp_dispbox();
  140.     dispbox.yzero = dy;
  141.     dispbox.yheight = dh;
  142.     dispbox.image.data = data;
  143.   }
  144.   /* replace the panbox with a new one */
  145.   block = (int)coord.pantoimg.inx_outx;
  146.   bh = coord.pan.Yhght;
  147.   dh = panbox.yheight;
  148.   dy = panbox.yzero;
  149.   data = panbox.image.data;
  150.   pb = buffer.panbuf;
  151.   sb = buffer.shortbuf;
  152.   /* this should always be true, since imtool doesn't do less than 512 */
  153.   if( block >= 1 ) {
  154.     y1 = (y1 / block) * block;
  155.     y2 = (((y2 / block) + 1) * block) - 1;
  156.     if( y2 >= coord.buf.Yhght )
  157.       y2 = coord.buf.Yhght - 1;
  158.     py_off = y1 / block;
  159.     buffer.shortbuf += (y1 * coord.buf.width);
  160.     buffer.panbuf += (py_off * coord.pan.Xwdth);
  161.     coord.pan.Yhght = (1 + y2 - y1) / block;
  162.     panbox.yzero = py_off;
  163.     panbox.yheight = coord.pan.Yhght;
  164.     panbox.image.data += (panbox.yzero * panbox.image.bytes_per_line);
  165.   } else
  166.     py_off = -1;
  167.   new_panimage();
  168.   disp_panbox();
  169.   if( py_off >= 0 ) {
  170.     buffer.shortbuf = sb;
  171.     buffer.panbuf = pb;
  172.     panbox.yzero = dy;
  173.     panbox.yheight = dh;
  174.     panbox.image.data = data;
  175.   }
  176.   coord.pan.Yhght = bh;
  177. }
  178.  
  179. /*
  180.  * Subroutine:    set_imtool_scale
  181.  * Purpose:    Force the scalemap to match the range of imtool image data
  182.  */
  183. void set_imtool_scale()
  184. {
  185.   void set_imtool_colors(), make_scalemap(), touch_submenu_button();
  186.  
  187.   /* identify min and max used by imtool */
  188.   buffer.clipmin = 1;
  189.   buffer.clipmax = 200;
  190.   buffer.scale_min = 0;
  191.   buffer.scale_max = 200;
  192.   /* force new scaling, but not hisotgram equalize if it would be invoked */
  193.   if( (color.scale.mode == SOP_HistEq) &&
  194.       (color.ncolors < 200) && (color.ncolors > 1) ) {
  195.     color.scale.mode = SOP_Linear;
  196.     touch_submenu_button(SOP, SOP_Linear);
  197.   }
  198.   if( color.ncolors == 1 ) {
  199.     color.ncolors = 256;
  200.     make_scalemap(0, 200);
  201.     color.ncolors = 1;
  202.   } else {
  203.     make_scalemap(0, 200);
  204.     set_imtool_colors();
  205.   }
  206. }
  207.  
  208. /*
  209.  * Subroutine:    set_imtool_colors
  210.  * Purpose:    Map colors used as graphics options in imtool
  211.  */
  212. void set_imtool_colors ()
  213. {
  214.   unsigned char *lookup;
  215.  
  216.   lookup = buffer.scalemap + SCALEOFF;
  217.   /* imtool cursor color */
  218.   lookup[201] = (unsigned char)color.gcset.draw.foreground;
  219.   lookup[202] = (unsigned char)color.hard.true_black;
  220.   lookup[203] = (unsigned char)color.hard.true_white;
  221.   lookup[204] = (unsigned char)color.hard.red;
  222.   lookup[205] = (unsigned char)color.hard.green;
  223.   lookup[206] = (unsigned char)color.hard.blue;
  224.   lookup[207] = (unsigned char)color.hard.yellow;
  225.   lookup[208] = (unsigned char)color.hard.std_black;    /* imtool cyan */
  226.   lookup[209] = (unsigned char)color.hard.std_white;    /* imtool magenta */
  227.   lookup[210] = (unsigned char)color.hard.yellow;    /* imtool coral */
  228.   lookup[211] = (unsigned char)color.hard.red;        /* imtool maroon */
  229.   lookup[212] = (unsigned char)color.hard.yellow;    /* imtool orange */
  230.   lookup[213] = (unsigned char)color.hard.std_white;    /* imtool khaki */
  231.   lookup[214] = (unsigned char)color.hard.red;        /* imtool orchid */
  232.   lookup[215] = (unsigned char)color.hard.green;    /* imtool turquoise */
  233.   lookup[216] = (unsigned char)color.hard.blue;        /* imtool violet */
  234.   lookup[217] = (unsigned char)color.hard.std_white;    /* imtool wheat */
  235. }
  236.  
  237. #endif
  238.            
  239.                                                                
  240.                                                               
  241.  
  242.                                                                
  243.                                                              
  244.